package kgame5.pbe.atlantic.fsm {
	import kgame5.k3d.core.math.Vector3D;
	import kgame5.k3d.core.obj3d.spacial.SpacialVO;
	import kgame5.kutil.SafeTimer;
	import kgame5.pbe.atlantic.vo.EntityVO;

	/**
	 * @author kangkai
	 * TODO 这个通过fsm发送event到GameActor.理由是减少GameActor暴露的接口
	 * TODO 注意,以后SpacialManager
	 */
	public class GState {
		//______________Property____________________
		private var ID : int = -1;//stateID

		protected var timer : SafeTimer = new SafeTimer();//安全的计时器，非常常用

		protected var fsm : FSM;// 对外发出事件，切换状态用

		protected var _entVO : EntityVO;//数据结构,具体使用时把它转化成自己适用的值
		protected var spcVO : SpacialVO;//刚体数据
	
		//快捷方式
		protected var v : Vector3D;//速度
		protected var r : Vector3D;//位置
		protected var p : Vector3D;//角度
	
		//________________Method____________________

		public function GState(id : int,fsm : FSM,_vo:EntityVO) {
			//其实stateID都是唯一的和一个State的子类对应，所以stateID是在State类声明的时候就自带的， 可以不靠外界传入
			this.ID = id;
		
			this.fsm = fsm;
		
		
			//
			this._entVO = _vo;
		
			this.spcVO = _entVO.spcVO;
		
			v = spcVO.v3d_v;
			r = spcVO.v3d_r;
			p = spcVO.v3d_p;
		}

		
		public function getID() : int {
			return ID;
		}

		//进入状态,info很重要，在进入一个状态的时候被传入的参数，比如如果是进入移动状态，则要传入移动目的地
		public function enter(info : Object = null) : void {
			
		}

		//执行状态
		public function update() : void {
		}

		//退出状态
		public function exit() : void {
		}
		
		//---非常实用的函数---
		//由viewComp通知有被点击了
		public function click(x:int,y:int):void{
			
		}
		
		//由viewComp通知当前活动的状态时动画播放完毕
		public function endOFrame(animName:String):void{
			
		}
	}//end of class
}

	//protected var senceWorld:ISenceWorld;
	
	//需要写复杂的程序由GameWorld传入
	//protected var spacialManager:SpacialManager;//空间管理器，寻路径等使用
//	//当Entity被添加到世界后，被world调用，传入
//	public function setSenceWorld(senceWorld:ISenceWorld):void{
//		this.senceWorld=senceWorld;
//	}
//	//当Entity被添加到世界后，被world调用，传入
//	public function setSpacialManager(spacialManager:SpacialManager):void{
//		this.spacialManager=spacialManager;
//	}

//	public function setVO(p_vo:EntityVO):void{
//		this._vo=p_vo;
//	}
//	
//	public function setHardVO(hardVO:HardVO):void{
//		this.hardVO=hardVO;
//		
//		v= hardVO.v3d_v;
//		p= hardVO.v3d_p;
//		r= hardVO.v3d_r;
//	}